home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / LTP_Find.c < prev    next >
C/C++ Source or Header  |  1995-09-24  |  3KB  |  171 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. WORD __regargs
  10. LTP_Find_Clicked_Item(LayoutHandle *handle,ObjectNode *radio,LONG x,LONG y)
  11. {
  12.     if(x >= radio -> Left + INTERWIDTH)
  13.     {
  14.         WORD i,top = radio -> Top,height,single;
  15.  
  16.         height = ((radio -> Height + handle -> InterHeight) / radio -> Lines);
  17.         single = height - handle -> InterHeight;
  18.  
  19.         for(i = 0 ; i <= radio -> Max ; i++)
  20.         {
  21.             if(y >= top && y < top + single)
  22.                 return(i);
  23.             else
  24.                 top += height;
  25.         }
  26.     }
  27.  
  28.     return(-1);
  29. }
  30.  
  31.  
  32. /*****************************************************************************/
  33.  
  34.  
  35. ObjectNode * __regargs
  36. LTP_FindNode_Position(ObjectNode *group,LONG x,LONG y)
  37. {
  38.     ObjectNode    *node;
  39.     ULONG         page;
  40.  
  41.     SCANPAGE(group,node,page)
  42.     {
  43.         if(node -> Type == GROUP_KIND)
  44.         {
  45.             ObjectNode *result;
  46.  
  47.             if(result = LTP_FindNode_Position(node,x,y))
  48.                 return(result);
  49.             else
  50.             {
  51.                 if(node -> Top <= y && node -> Top + node -> Height > y && node -> Left <= x && node -> Left + node -> Width > x)
  52.                 {
  53.                     while(node)
  54.                     {
  55.                         if(node -> ID <= PHANTOM_GROUP_ID)
  56.                             node = node -> Special . Group . ParentGroup;
  57.                         else
  58.                             return(node);
  59.                     }
  60.  
  61.                     return(NULL);
  62.                 }
  63.             }
  64.         }
  65.         else
  66.         {
  67.             if(node -> Top <= y && node -> Top + node -> Height > y)
  68.             {
  69.                 switch(node -> Type)
  70.                 {
  71.                     case CHECKBOX_KIND:
  72.  
  73.                         if(node -> LabelPlace == PLACE_LEFT)
  74.                         {
  75.                             if(node -> Left - (node -> LabelWidth + INTERWIDTH) <= x && node -> Left - INTERWIDTH > x)
  76.                                 return(node);
  77.                         }
  78.                         else
  79.                         {
  80.                             if(node -> Left + node -> Width + INTERWIDTH <= x && node -> Left + node -> Width + INTERWIDTH + node -> LabelWidth > x)
  81.                                 return(node);
  82.                         }
  83.  
  84.                         break;
  85.  
  86.                     case MX_KIND:
  87.  
  88.                         if(node -> Left + node -> Width + INTERWIDTH <= x && node -> Left + node -> Width + INTERWIDTH + node -> Special . Radio . LabelWidth > x)
  89.                             return(node);
  90.  
  91.                         break;
  92.  
  93.                     default:
  94.  
  95.                         if(node -> Left <= x && node -> Left + node -> Width > x)
  96.                         {
  97.                             if(node -> Type == PICKER_KIND)
  98.                                 return(node -> Special . Picker . Parent -> UserData);
  99.  
  100.                             if(node -> Type == INCREMENTER_KIND)
  101.                                 return(node -> Special . Incrementer . Parent -> UserData);
  102.  
  103.                             return(node);
  104.                         }
  105.                 }
  106.             }
  107.         }
  108.     }
  109.  
  110.     return(NULL);
  111. }
  112.  
  113.  
  114. /*****************************************************************************/
  115.  
  116.  
  117. ObjectNode * __regargs
  118. LTP_FindNode(ObjectNode *group,LONG id)
  119. {
  120.     ObjectNode *node;
  121.     ObjectNode *result;
  122.  
  123.     SCANGROUP(group,node)
  124.     {
  125.         if(node -> Type == GROUP_KIND)
  126.         {
  127.             if(node -> ID == id)
  128.                 return(node);
  129.  
  130.             if(result = LTP_FindNode(node,id))
  131.                 return(result);
  132.         }
  133.         else
  134.         {
  135.             if((node -> ID == id) && (node -> Type != PICKER_KIND) && (node -> Type != INCREMENTER_KIND))
  136.                 return(node);
  137.         }
  138.     }
  139.  
  140.     return(NULL);
  141. }
  142.  
  143.  
  144. /*****************************************************************************/
  145.  
  146.  
  147. struct Gadget * __regargs
  148. LTP_FindGadget(LayoutHandle *handle,LONG id)
  149. {
  150.     if(handle && handle -> GadgetArray)
  151.     {
  152.         LONG i = handle -> Count;
  153.  
  154.         while(i--)
  155.         {
  156.             if(handle -> GadgetArray[i])
  157.             {
  158.                 if(handle -> GadgetArray[i] -> GadgetID == id && handle -> GadgetArray[i] -> UserData)
  159.                 {
  160.                     register struct ObjectNode *Node = (struct ObjectNode *)handle -> GadgetArray[i] -> UserData;
  161.  
  162.                     if(Node -> PointBack == Node && Node -> Host == handle -> GadgetArray[i])
  163.                         return(handle -> GadgetArray[i]);
  164.                 }
  165.             }
  166.         }
  167.     }
  168.  
  169.     return(NULL);
  170. }
  171.